'use strict';

var utils = require('./../utils');

// 重复项被Node忽略的请求头
// c.f. https://nodejs.org/api/http.html#http_message_headers
var ignoreDuplicateOf = [
  'age',
  'authorization',
  'content-length',
  'content-type',
  'etag',
  'expires',
  'from',
  'host',
  'if-modified-since',
  'if-unmodified-since',
  'last-modified',
  'location',
  'max-forwards',
  'proxy-authorization',
  'referer',
  'retry-after',
  'user-agent',
];

/**
 * 将请求头解析为对象
 *
 * ↓请求中的请求头文本↓
 * ```
 * Date: Wed, 27 Aug 2014 08:58:49 GMT
 * Content-Type: application/json
 * Connection: keep-alive
 * Transfer-Encoding: chunked
 * ```
 *
 * @param {String} headers 需要解析的头文件
 * @returns {Object} 解析为对象的头
 */
module.exports = function parseHeaders(headers) {
  var parsed = {};
  var key;
  var val;
  var i;

  // 如果没有请求头文本，直接返回{}
  if (!headers) {
    return parsed;
  }

  // 按照换行分割
  utils.forEach(headers.split('\n'), function parser(line) {
    // 每一行`:`的索引
    i = line.indexOf(':');
    // 每一行的Key，大写处理
    key = utils.trim(line.substr(0, i)).toLowerCase();
    // 每一行的值
    val = utils.trim(line.substr(i + 1));

    // 如果Key存在
    if (key) {
      // 如果结果中已经存在这个Key了，并且这个Key在Node重复忽略列表中
      if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {
        // 直接忽略
        return;
      }
      // 如果key是设置cookie
      if (key === 'set-cookie') {
        // 如果结果中还没有设置cookie的key，那么将结果和一个空数组连接赋值
        parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);
      } else {
        // 普通key，如果已经有这个值了，前面加一个逗号
        parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
      }
    }
  });

  return parsed;
};
